Import
sdasdaksldjklsdjklasjdklj dasmkdlmsakldmklsadmkls
import numpy as np
import pandas as pd
pd.Series.map
- map은 Series의 method로 mapping(또는 function)을 통해 Series에 있는 각각의 값을 다른 값으로 바꾼다.
- Note : Series에 있는 각각의 값이 elementwise로 함수(mapping)에 입력이 되어 여러번 계산된다고 생각하면 편하다.
- Parameters
- arg : function,dict,Series…
- …
- Returns
Data
s = pd.Series(["cat","dog",np.nan,"rabbit"])
arg가 dict인 경우
s.map({"cat":"kitten","dog":"puppy"})
0 kitten
1 puppy
2 NaN
3 NaN
dtype: object
- Series의 값 중 dict의 key와 일치하는 값이 없으면 NaN으로 바뀜.
arg가 Series인 경우
s2 = pd.Series(["lion","elephant","dog",np.nan])
s.map(s2)
0 NaN
1 NaN
2 NaN
3 NaN
dtype: object
arg가 function인 경우
s.map(lambda x : "I am a {}".format(x))
0 I am a cat
1 I am a dog
2 I am a nan
3 I am a rabbit
dtype: object
잘못된 사용 예시
s = pd.Series([0.1,3,2,0.4])
s.map(lambda x : sum(x))
>>> TypeError: 'float' object is not iterable
- 각각의 값(여기선 float)이 따로따로 함수(mapping)이 입력된다. 하지만 sum함수는 float형을 input으로 할 수 없으므로 오류 발생함.(float형은 iterable하지 않음)
s = pd.Series([0.3,2,0.4,5])
s.map(np.var)
0 0.0
1 0.0
2 0.0
3 0.0
dtype: float64
- 오류가 뜨지 않으나 원하던 동작이 아니다. 각각의 변수에 대해서 평균값을 구하려 했겠지만 각각의 값에 mean이 되므로 그 값 자체이다.
pd.DataFrame.apply
- apply는 DataFrame의 method로 DataFrame의 축을 따라서 함수를 적용한다.
- Note : DataFrame의 apply는 vector(column,row)단위로 함수에 입력된다.(map이나 applymap은 element들이 함수의 입력이 된다.)
- Parameters
- func : 각각의 column,row(vector)에 적용되는 함수
- axis : 0이면 row에 1이면 column애 적용
- Returns
Data
n1 = pd.Series([0.1,4,0.35,2])
n2 = pd.Series([0.3,0.4,3,-5])
df = pd.DataFrame({"n1":n1,"n2":n2})
df
|
n1 |
n2 |
0 |
0.10 |
0.3 |
1 |
4.00 |
0.4 |
2 |
0.35 |
3.0 |
3 |
2.00 |
-5.0 |
column에 function 적용
- column vector에 함수 적용한다고 생각하자.
df.apply(func = lambda x : sum(x)/len(x),axis=0)
n1 1.6125
n2 -0.3250
dtype: float64
n1 1.6125
n2 -0.3250
dtype: float64
#vector에 elementwise**2
#np.array를 **2하면 모든 원소가 제곱되는 것과 같다.
df.apply(func = lambda x : x ** 2,axis=0)
|
n1 |
n2 |
0 |
0.0100 |
0.09 |
1 |
16.0000 |
0.16 |
2 |
0.1225 |
9.00 |
3 |
4.0000 |
25.00 |
#vector에 elementwise로 sin취함.
df.apply(func = lambda x : np.sin(x),axis=0)
|
n1 |
n2 |
0 |
0.099833 |
0.295520 |
1 |
-0.756802 |
0.389418 |
2 |
0.342898 |
0.141120 |
3 |
0.909297 |
0.958924 |
row에 function 적용
0 0.40
1 4.40
2 3.35
3 -3.00
dtype: float64
|
n1 |
n2 |
0 |
0.099833 |
0.295520 |
1 |
-0.756802 |
0.389418 |
2 |
0.342898 |
0.141120 |
3 |
0.909297 |
0.958924 |
#vector에 elementwise**2
#np.array를 **2하면 모든 원소가 제곱되는 것과 같다.
df.apply(func = lambda x : x ** 2,axis=1)
|
n1 |
n2 |
0 |
0.0100 |
0.09 |
1 |
16.0000 |
0.16 |
2 |
0.1225 |
9.00 |
3 |
4.0000 |
25.00 |
pd.DataFrame.applymap
- applymap은 DataFrame의 method로 mapping(또는 function)을 통해 DataFrame에 있는 각각의 값을 다른 값으로 바꾼다.
- Note : DataFrame에 있는 각각의 값이 elementwise로 함수(mapping)에 입력되어 여러번 계산된다고 생각하면 편하다.
- Parameters
- Returns
Data
n1 = pd.Series([0.1,4,0.35,2])
n2 = pd.Series([0.3,0.4,3,-5])
df = pd.DataFrame({"n1":n1,"n2":n2})
df
|
n1 |
n2 |
0 |
0.10 |
0.3 |
1 |
4.00 |
0.4 |
2 |
0.35 |
3.0 |
3 |
2.00 |
-5.0 |
올바른 사용
df.applymap(lambda x : "값은 {}".format(x))
|
n1 |
n2 |
0 |
값은 0.1 |
값은 0.3 |
1 |
값은 4.0 |
값은 0.4 |
2 |
값은 0.35 |
값은 3.0 |
3 |
값은 2.0 |
값은 -5.0 |
df.applymap(lambda x : len(str(x)))
|
n1 |
n2 |
0 |
3 |
3 |
1 |
3 |
3 |
2 |
4 |
3 |
3 |
3 |
4 |
df.applymap(lambda x : x ** 2)
|
n1 |
n2 |
0 |
0.0100 |
0.09 |
1 |
16.0000 |
0.16 |
2 |
0.1225 |
9.00 |
3 |
4.0000 |
25.00 |
잘못된 사용
df.applymap(lambda x : sum(x))
>>> TypeError: 'float' object is not iterable
- Series의 map method와 마찬가지로 DataFrame의 applymap method도 각각의 값(여기선 float)이 따로따로 함수(mapping)에 입력된다. 그러므로 sum함수에서 오류가 발생한다.
df.applymap(lambda x : np.mean(x))
|
n1 |
n2 |
0 |
0.10 |
0.3 |
1 |
4.00 |
0.4 |
2 |
0.35 |
3.0 |
3 |
2.00 |
-5.0 |
- 오류가 뜨지 않으나 원하던 동작이 아니다. 각각의 변수에 대해서 평균값을 구하려 했겠지만 각각의 값에 mean이 되므로 그 값 자체이다.